<?php
# This file is part of "Central heating manager".

# "Central heating manager" is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.

# "Central heating manager" is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with "Central heating manager".  If not, see <http://www.gnu.org/licenses/>.



/**
 * Récupère un tableau de toutes les zones
 */
function getZones($zoneid = 0){
	global $conn;
	
	$data = array();
	
	$sql = 'SELECT * FROM zones '.($zoneid > 0 ? ' WHERE id = '.$zoneid : 'ORDER BY ordre');
	
	$result = $conn->query($sql);
	
	while ($row = $result->fetchArray()) {
		
		// On affecte la zone au tableau des zones
		$datatemp = purgeIndex($row);
		$data[$datatemp['id']] = $datatemp;

	}

	// Si on a demandé une zone en particulier, on récupère directement le contenu
	if($zoneid > 0){
		$data = $data[$zoneid];
	}
	
	return $data;
}

/**
 * Récupère un tableau des horaires d'une zone donné
 */
function getHoraires($zoneid){
	global $conn;
	
	$data = array();
	
	$sql = 'SELECT * FROM horaires WHERE zoneid = '.(int)$zoneid.' ORDER BY heure';
	
	$result = $conn->query($sql);
	
	while ($row = $result->fetchArray()) {
		
		// On affecte la zone au tableau des zones
		$datatemp = purgeIndex($row);
		$data[$datatemp['periodeid']][$datatemp['heure']] = $datatemp['modeid'];
	}
	
	return $data;
}


/**
 * Récupère un tableau des relais d'une zone donné
 */
function getRelais($zoneid){
	global $conn;
	
	$data = array();
	
	$sql = 'SELECT * FROM relais WHERE zoneid = '.(int)$zoneid.' ORDER BY alternance';

	$result = $conn->query($sql);
	
	while ($row = $result->fetchArray()) {
		
		// On affecte la zone au tableau des zones
		$datatemp = purgeIndex($row);
		$data[$datatemp['alternance']] = $datatemp['wiringpiPin'];
	}
	
	return $data;
}

/**
 * Récupère un tableau de tous les modes
 */
function getModes($params = array()){
	global $conn;
	
	if (array_key_exists('manuel', $params)){
		if ($params['manuel']){$where = " WHERE manuel = 1";}
	}
	elseif (array_key_exists('modeid', $params)){
		$where = " WHERE id = '".$params['modeid']."'";
	}
	
	$data = array();
	
	$sql = 'SELECT * FROM modes '.$where.' ORDER BY ordre';
//echo $sql;
	$result = $conn->query($sql);
	
	while ($row = $result->fetchArray()) {
		
		// On affecte la zone au tableau des zones
		$datatemp = purgeIndex($row);
		$data[$datatemp['id']] = $datatemp;

	}
	
	// Si mode seul => on récupère directement les données
	if (array_key_exists('modeid', $params)){
		$data = $data[$params['modeid']];
	}
	
	return $data;
}


function getCurrentMode($zoneid){
	global $conn;
	
	$sql = "SELECT modeid, (jusqua <> '' AND jusqua < datetime('now', 'localtime')) AS expire FROM zones WHERE id = ".(int)$zoneid;
//echo $sql;
	$result = $conn->query($sql);
	
	// Zone trouvée 
	if($row = $result->fetchArray()){
		
		$modeid = $row['modeid'];
echo $modeid;
		
		// Mode manuel => on vérifie si le mode manuel est expiré ou non
		if($modeid != 'auto' && $row['expire'] == 1){
			// Mise à jour de la zone en conséquence
			// update zone set modeid = 'auto', jusqua = ''
echo 'expire';		
			$modeid = 'auto';
		}
		
		// Si mode auto, on applique les horaires
		if($modeid == 'auto') {
			$modeid 	= 'confort'; 					// Mode par défaut si pas d'horaires
			$jour 		= date('N');					// Jour de la semaine (lundi = 1)
			$periodeid	= $jour < 6 ? "S" : "W";		// Période horaire
			
			$sqlh = "SELECT modeid FROM horaires WHERE zoneid=".(int)$zoneid." AND periodeid ='".$periodeid."' AND heure <= time('now', 'localtime') ORDER BY heure DESC LIMIT 1";
echo $sqlh;
			$resulth = $conn->query($sqlh);
			
			// On a un horaire pour la plage demandée => on récupère le mode
			if($rowh = $resulth->fetchArray()){
				$modeid = $rowh['modeid'];
			}
			
			// Sinon on doit récupérer le mode de la plage précédente
			else {
				switch ($jour){
					// Lundi
					case 1:
						$periodeidprec = 'W';
						break;
					
					// Samedi
					case 6:
						$periodeidprec = 'S';
						break;
						
					default:
						$periodeidprec = $periodeid;
				}
				
				// On prend l'horaire max pour le jour précédent
				$sqlh = "SELECT modeid FROM horaires WHERE zoneid=".(int)$zoneid." AND periodeid ='".$periodeidprec."' ORDER BY heure DESC LIMIT 1";
				$resulth = $conn->query($sqlh);
				
				// On a un horaire pour la plage demandée => on récupère le mode
				if($rowh = $resulth->fetchArray()){
					$modeid = $rowh['modeid'];
				}
				else {
					$modeid = null;
				}
			}
		}
		
		// Retour du mode concerné
		return $modeid;
	}
	
	// Zone inconnue
	else {
		return null;
	}
}

/**
 * On supprime les index numériques renvoyés par SQLite
 */
 
function purgeIndex($row){
	$data = array();	
	foreach($row as $champ => $valeur){
	
		if (!is_numeric($champ)){
			$data[$champ] = $valeur;
		}		
	}
	
	return $data;
}